package com.xjh.basestudy.javabase.thread_final.threadpool.demo;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

/**
 * @Author:XuJianHua
 * @Date:2022/10/26
 * @Description:
 *
 * 为什么使用ThreadPoolTaskExecutor？
 * ThreadPoolTaskExecutor是spring core包中提供的，而ThreadPoolExecutor是JDK中的JUC包下提供的，
 * 并且ThreadPoolTaskExecutor是在ThreadPoolExecutor的基础上进一步进行了封装处理，因此我们项目中直接使用ThreadPoolTaskExecutor即可。
 */
public class ThreadPoolConfig {

  @Bean(name = "threadPoolTaskExecutor")
  public ThreadPoolTaskExecutor getThreadPoolTaskExecutor() {
    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
    // 核心线程数
    taskExecutor.setCorePoolSize(10);
    // 最大线程数
    taskExecutor.setMaxPoolSize(100);
    // 阻塞队列长度
    taskExecutor.setQueueCapacity(100);
    // 空闲线程最大存活时间
    taskExecutor.setKeepAliveSeconds(200);
    // 拒绝策略
    taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
    taskExecutor.initialize();
    return taskExecutor;
  }

/**
 *
 * 以下创建线程池的方式是不被允许的
 * 线程池不允许使用Executors去创建，而是通过ThreadPoolExecutor的方式，这样的处理方式让写的同学更加明确线程池的运行规则，规避资源耗尽的风险。 说明：Executors各个方法的弊端：
 * 1）newFixedThreadPool和newSingleThreadExecutor:
 *   主要问题是堆积的请求处理队列可能会耗费非常大的内存，甚至OOM。
 * 2）newCachedThreadPool和newScheduledThreadPool:
 *   主要问题是线程数最大数是Integer.MAX_VALUE，可能会创建数量非常多的线程，甚至OOM。
 * */
//  ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);

}
